#include "logger.h"

#define 	RUTA_SALIDA		"./OUT/";

Logger* Logger::instance = NULL;

Logger* Logger::get_instance(){
	if (Logger::instance == NULL) 
			Logger::instance = new Logger();
	return instance;	
}

void Logger::destroy(){
	delete Logger::instance;
	Logger::instance = NULL;	
}
void Logger::comenzar_log(){
	terminar_log();
	std::string nombre = RUTA_SALIDA;
	nombre += "Resultados_";
	nombre += time_stamp();
	this->archivo_out.open(nombre.c_str());	
}
		
void Logger::terminar_log(){
	if( hay_log_abierto() )	
		archivo_out.close();
}

void Logger::saltar_linea() throw(ExcepLoggerCerrado){
	if( hay_log_abierto() ){
		archivo_out << "\n";
		archivo_out.flush();
	}
	else
		throw ExcepLoggerCerrado("Error - Archivo de Log cerrado");
}

void operator<<(Logger &l, std::string log ) throw (ExcepLoggerCerrado){
	if( l.hay_log_abierto() ){
		l.archivo_out << "[" << l.time_stamp()<<"]" << log << "\n";
		l.archivo_out.flush();
	}
	else
		throw ExcepLoggerCerrado("Error - Archivo de Log cerrado");
}	
void operator<<(Logger &l , std::ifstream &archivo) throw (ExcepLoggerCerrado){
	std::string aux;
	
	//Si hay log abierto y si esta el archivo de entrada abierto lee
	//linea por linea y las pasa al log
	if( l.hay_log_abierto() ){
		if( archivo.is_open() ){
			//getline(archivo,aux);
			while( !archivo.eof() ){
				getline(archivo,aux);
				l.archivo_out << aux << "\n";
				//getline(archivo,aux);
			}
		}
		else
			throw ExcepLoggerCerrado("Error - Archivo de entrada cerrado");
		
	}
	else
		throw ExcepLoggerCerrado("Error - Archivo de Log cerrado");	
}

bool Logger::hay_log_abierto(){
	return archivo_out.is_open();
}

std::string Logger::time_stamp(){
	//obtengo la hora
	time_t fecha_hora;
	fecha_hora = time(NULL);
	//lo paso a una cadena	
	char cadena[16];
    strftime ( cadena, 16, "%Y%m%d_%H%M%S", localtime(&fecha_hora));
	//lo asigno al string y lo devuelvo
	std::string nombre(cadena);
	return nombre;
}
